package com.dragon.common.modules.file.service.def;

import com.chris.dev.base.libs.v1.http.params.ResourceParam;
import com.chris.dev.base.libs.v1.http.results.ResourceResult;
import com.dragon.common.base.exceptions.CommonException;
import com.dragon.common.modules.file.web.model.result.Base64Result;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.Base64;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @author Chris Chan
 * Create On 2025/8/26 下午7:03
 * Use for: 文件系统服务定义
 * Explain:
 */
public interface FileService {

    /**
     * 文件上传
     * 保留原文件名
     *
     * @param file
     * @return
     */
    default ResourceResult upload(MultipartFile file) {
        return uploadWithName(file.getOriginalFilename(), file);
    }

    /**
     * 文件上传
     * 带文件命名
     *
     * @param fileName
     * @param file
     * @return
     */
    ResourceResult uploadWithName(String fileName, MultipartFile file);

    /**
     * 文件上传
     * 可选重命名模式
     *
     * @param mode
     * @param file
     * @return
     */
    ResourceResult uploadFile(int mode, MultipartFile file);

    /**
     * 多文件上传
     *
     * @param mode
     * @param files
     * @return
     */
    default List<ResourceResult> uploadFiles(int mode, MultipartFile... files) {
        if (null == files) {
            throw CommonException.create(1, "至少需要一个文件");
        }
        return Stream.of(files)
                .map(file -> uploadFile(mode, file))
                .collect(Collectors.toList());
    }

    /**
     * 以Base64方式上传文件
     *
     * @param param
     * @return
     */
    ResourceResult uploadBase64(ResourceParam param);


    /**
     * 文件转Base64
     *
     * @param file
     * @return
     */
    default Base64Result fileToBase64(MultipartFile file) {
        try {
            String base64 = Base64.getEncoder().encodeToString(file.getBytes());
            return Base64Result.create(base64);
        } catch (IOException e) {
            e.printStackTrace();
            throw CommonException.of(1, "文件转换失败");
        }
    }
}
